package com.itheima.service.impl;


import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.wemedia.dtos.WmLoginDto;
import com.heima.model.wemedia.pojos.WmUser;
import com.heima.utils.common.HutoolJWT;
import com.itheima.mapper.WMUserMapper;
import com.itheima.service.WMUserService;
import org.springframework.stereotype.Service;

import java.util.HashMap;

/**
 * @author yunfei
 * @date 2022年10月14日 9:46
 * <p>
 * APP客户端User业务实现类
 */
@Service
public class WMServiceImpl extends ServiceImpl<WMUserMapper, WmUser> implements WMUserService {
    /**
     * App端用户登录的业务实现
     *
     * @param loginDto
     * @return
     */
    @Override
    public ResponseResult loginAuth(WmLoginDto loginDto) {

        // 我们的自媒体人是不允许自己注册的
        // 正常的流程应该是 普通用户 进行实名认证后  后台帮这个用户自己创建一个自媒体账号
        // 并把创建的自媒体账户的账户密码发给用户
        // 用户使用账户和密码进行登录


        // 校验数据的合法性  手机号码
        if (!StrUtil.isAllNotBlank(loginDto.getName(), loginDto.getPassword())) {
            // 返回手机号码不合法
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "用户名或密码不能为空");
        }

        // 根据用户名查询一个自媒体账户
        WmUser wmUser = getOne(Wrappers.lambdaQuery(WmUser.class).eq(WmUser::getName, loginDto.getName()));
        if (ObjectUtil.isNull(wmUser)) return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);

        // 开始比对密码
        String pass = SecureUtil.md5(loginDto.getPassword() + wmUser.getSalt());
        if (!StrUtil.equals(pass, wmUser.getPassword())) {
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        }
        // 判断账户是否可用
        // 在代码中出现的这种数字 如果也没有上下文的关联  让人找不到说明
        // 这个数字就称之为 魔法数字  我们在开发中应该尽量避免魔法数字
        // 可以通过声明成员变量  常量  枚举
        if (wmUser.getStatus() != 9) {
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_STATUS_ERROR);
        }

        // 生成Token 并 返回
        HashMap<String, Object> mm = new HashMap<>();
        mm.put("id", wmUser.getId());
        String token = HutoolJWT.creatToken(mm);
        HashMap<Object, Object> result = new HashMap<>();
        result.put("token", token);
        /* 在返回数据之前 把敏感信息置为空 */
        wmUser.setPassword("");
        wmUser.setSalt("");
        wmUser.setPhone("");
        result.put("user", wmUser);
        return ResponseResult.okResult(result);
    }
}
